.data
	a: .long 7
	b: .long 77
	result: .long 0
	outform: .string "%d ist ggT von %d und %d.\n"

.text
.global main
main:
# start code

// a uebergeben
movl a, %eax
pushl %eax
// b uebergeben
movl b, %eax
pushl %eax
subl $4, %esp // platz fuer return


call ggt //ggt berechnen lassen
popl %eax // antwort in result speichern
movl %eax, result
addl $8, %esp // uebergabeparameter 'vergessen'

pushl a // a an ausgabe
pushl b // b an ausgabe
pushl result // result an ausgabe
pushl $outform
call printf
addl $16, %esp

// programmende
movl $1, %eax
int $0x80

/*
* parameter & return werden per stack uebergeben
* params: .long a, .long b
* return: .long
*/
.global ggt
ggt:
pushl %ebp // alten base pointer auf den stack
mov %esp, %ebp // aktueller stack pointer wird base pointer


// parameter in eax und edx laden
movl 16(%ebp), %eax // das ist das A
movl 12(%ebp), %edx // das ist das B
// while sprung: solange edx echt grosser als 0 spring so operationAB
.while:
cmpl $0, %edx
jg .operationAB

// result auf stack speichern (auf dem speicher der dafuer ist)
movl %eax, 8(%ebp)

// leave oder:
mov %ebp, %esp
popl %ebp
// zurueck zum aufrufer
ret

.operationAB:
cmpl %edx, %eax
jle .elseBlock // b ist groesser oder gleich a -> springe zum elseBlock
subl %edx, %eax // a = a - b
jmp .while // wieder zur bedingung der while-schleife

.elseBlock:
subl %eax, %edx // b = b - a
jmp .while // und wieder an den anfrage der while schleife

